package businessObject;



import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.TreeMap;
import java.util.TreeSet;

import dataTransferObject.Destino;
import dataTransferObject.Origen;
import dataTransferObject.Estado;
import dataTransferObject.Usuario;

public class ListarMuro {
	
	private static ListarMuro muro;

	public static synchronized ListarMuro getInstance() {
		if (muro == null) {
			muro = new ListarMuro();
		}
		return muro;
	}
	
public TreeMap<Destino,Usuario> getActualizacionesDestino(int idUsuario){
		

		GestionUsuario pos = GestionUsuario.getInstance();
		Usuario usuario = pos.getUsuarioConAmigos(idUsuario);
		List<Usuario> amigos= usuario.getAmigos();
		Comparator<Object> comp= new comparadorPorHora();
		TreeMap<Destino,Usuario> lista= new TreeMap<Destino,Usuario>(comp);
		for(Usuario amigo: amigos){
			List<Destino> destinos=amigo.getVoyA();
			
			for(Destino voy: destinos){
				lista.put(voy,amigo);
			}
		}

		return lista;
	}
	
public TreeMap<Origen,Usuario> getActualizacionesOrigen(int idUsuario){
	
	GestionUsuario pos = GestionUsuario.getInstance();
	Usuario usuario = pos.getUsuarioConAmigos(idUsuario);
	List<Usuario> amigos= usuario.getAmigos();
	Comparator<Object> comp= new comparadorPorHora();
	TreeMap<Origen,Usuario> lista= new TreeMap<Origen,Usuario>(comp);
	
	for(Usuario amigo: amigos){
		List<Origen> destinos=amigo.getEstoyEn();
		
		for(Origen voy: destinos){
			lista.put(voy,amigo);
		}
	}
	
			
	
	return lista;
}

public TreeMap<Estado,Usuario> getActualizacionesEstado(int idUsuario){
	
	GestionUsuario pos = GestionUsuario.getInstance();
	Usuario usuario = pos.getUsuarioConAmigos(idUsuario);
	List<Usuario> amigos= usuario.getAmigos();
	Comparator<Object> comp= new comparadorPorHora();
	TreeMap<Estado,Usuario> lista= new TreeMap<Estado,Usuario>(comp);
	
	for(Usuario amigo: amigos){
		List<Estado> estados=amigo.getEstados();
		
		for(Estado voy: estados){
			lista.put(voy,amigo);
		}
	}
	
			
	
	return lista;
}
	
	
public TreeMap<Object,Usuario> getActualizacionesCronologicas(int idUsuario){
	
	GestionUsuario pos = GestionUsuario.getInstance();
		Usuario usuario = pos.getUsuarioConAmigos(idUsuario);
		List<Usuario> amigos= usuario.getAmigos();
		Comparator<Object> comp= new comparadorPorHora();
		TreeMap<Object,Usuario> lista= new TreeMap<Object,Usuario>(comp);
		
		for(Usuario amigo: amigos){
			List<Origen> origenes=amigo.getEstoyEn();
			List<Destino> destinos=amigo.getVoyA();
			List<Estado> estados= amigo.getEstados();
			
			for(Origen estoy: origenes){
				lista.put(estoy,amigo);
			}
			for(Destino voy: destinos){
				lista.put(voy,amigo);
			}
			for(Estado estado: estados){
				lista.put(estado,amigo);
			}
		}
		
		if(lista.size()>18){
			int cont=0;
			List<Object> aux= new ArrayList<Object>();
			for(Object o: lista.keySet()){
				
				if(cont>18){
					aux.add(o);
				}
				
				cont++;
			}
			
			for(Object key:aux){
				lista.remove(key);
			}
			
			
		}
		
		
		return lista;
	}

public TreeSet<Object> getActualizacionesPropias(int idUsuario){
	
	GestionUsuario pos = GestionUsuario.getInstance();
	Usuario usuario = pos.getUsuarioConAmigos(idUsuario);
	Comparator<Object> comp= new comparadorPorHora();
	TreeSet<Object> lista= new TreeSet<Object>(comp);
	
		List<Origen> origenes=usuario.getEstoyEn();
		List<Destino> destinos=usuario.getVoyA();
		List<Estado> estados= usuario.getEstados();
		
		for(Origen estoy: origenes){
			lista.add(estoy);
		}
		for(Destino voy: destinos){
			lista.add(voy);
		}
		for(Estado estado: estados){
			lista.add(estado);
		}
		
	if(lista.size()>25){
		int cont=0;
		List<Object> aux= new ArrayList<Object>();
		for(Object o: lista){
			
			if(cont>25){
				aux.add(o);
			}
			
			cont++;
		}
		
		for(Object key:aux){
			lista.remove(key);
		}
		
		
	}
	
	
	return lista;
}

private class comparadorPorHora implements Comparator<Object>{

	public int compare(Object o1, Object o2) {

		Date hora2=null;
		Date hora1=null;
		if(o2 instanceof Origen){
			Origen origen= (Origen)o2;
			hora2=origen.getHora();
		}else if(o2 instanceof Destino){
			Destino destino= (Destino)o2;
			hora2=destino.getHora();
		}else if(o2 instanceof Estado){
			Estado estado= (Estado)o2;
			hora2=estado.getHora();
		}
		
		if(o1 instanceof Origen){
			Origen o= (Origen)o1;
			hora1=o.getHora();
		}else if(o1 instanceof Destino){
			Destino d= (Destino)o1;
			hora1=d.getHora();
		}else if(o1 instanceof Estado){
			Estado estado= (Estado)o1;
			hora1=estado.getHora();
		}
		
		return hora2.compareTo(hora1);
	}
		
}

	
}
